package co.edu.uniquindio.logica;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Inheritance;
import javax.persistence.Temporal;

import static javax.persistence.InheritanceType.JOINED;
import static javax.persistence.TemporalType.DATE;

/**
 * Entity implementation class for Entity: Subasta
 * esta entidad me representa a una subasta en la logica del negocio
 * 
 * @author Andres Felipe Abril
 * @author Luis Enrique Robledo
 */

@Entity
@Table(name="Subasta")
@Inheritance(strategy = JOINED)
public class Subasta implements Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	/**
	 * este atributo representa el nmero de la subasta y el la llave primaria de la clase
	 */
	@Id
	private int numSubasta;
	/**
	 * esta relacion representa que una subasta tiene un vendedor
	 */
	@ManyToOne
	private Vendedor vendedor;
	/**
	 * esta relacion representa que una subasta puede tener muchos compradores
	 */
	@ManyToMany
	private List<Comprador> compradores;
	/**
	 * esta relacion representa que una subasta pude tener muchas ofertas
	 */
	@OneToMany(mappedBy = "subasta")
	private List<Oferta> ofertas;
	/**
	 * este atributo representa el precio base de un subasta 
	 */
	private double precioBase;
	/**
	 * este atributo representa la fecha de inicio de una subasta 
	 */
	@Temporal(DATE)
	private Date fechaInicio;
	/**
	 * este atributo representa la fecha de terminacion de una subasta
	 */
	@Temporal(DATE)
	private Date fechaCierre;
	
	/**
	 * este metodo me permite crear una subasta 
	 * @param numSubasta
	 * @param vendedor
	 * @param comprador
	 * @param precioBase
	 */
	public Subasta(int numSubasta,Vendedor vendedor,double precioBase,Date fechaInicio,Date fechaCierre)
	{
		this.vendedor=vendedor;
		this.precioBase=precioBase;
		this.numSubasta=numSubasta;
		this.fechaCierre=fechaCierre;
		this.fechaInicio=fechaInicio;
	}
	/**
	 * metodo constructor obligatorio
	 */
	public Subasta()
	{
		
	}
	/**
	 * este metodo permite obtener el numero al que pertenece una subasta 
	 * @return el numero de la Subasta
	 */
	public int getNumSubasta() {
		return numSubasta;
	}
	/**
	 * este metodo permite modificar el numero de la subasta
	 * @param el nuevo numero de la subasta
	 */
	public void setNumSubasta(int numSubasta) {
		this.numSubasta = numSubasta;
	}
	/**
	 * este metodo permite obtener el vendedor asociado a la subasta
	 * @return el vendedor
	 */
	public Vendedor getVendedor() {
		return vendedor;
	}
	/**
	 * este metodo permite modificar el vendedor de la subasta
	 * @param el nuevo vendedor
	 */
	public void setVendedor(Vendedor vendedor) {
		this.vendedor = vendedor;
	}
	/**
	 * este metodo permite obtener la lista de las ofertas asociadas a la subasta
	 * @return el listado de ofertas asociadas a la subasta
	 */
	public List<Oferta> getOfertas() {
		return ofertas;
	}
	/**
	 * este metodo permite modificar la lista de las ofertas asociadas a la subasta 
	 * @param la nueva lista de ofertas
	 */
	public void setOfertas(List<Oferta> ofertas) {
		this.ofertas = ofertas;
	}
	/**
	 * este metodo me permite obtener el precio base de una subasta 
	 * @return el  precio Base de un subasta
	 */
	public double getPrecioBase() {
		return precioBase;
	}
	/**
	 * este metodo me permite modificar el precio base de una subasta
	 * @param el nuevo precio
	 */
	public void setPrecioBase(double precioBase) {
		this.precioBase = precioBase;
	}
	/**
	 * este metodo me permite obtener la lista de compradores de una subasta
	 * @return los compradores
	 */
	public List<Comprador> getCompradores() {
		return compradores;
	}
	/**
	 * este metodo me permite modificar la lista de compradores asociados a una subasta
	 * @param la nueva lista de compradores
	 */
	public void setCompradores(List<Comprador> compradores) {
		this.compradores = compradores;
	}
	/**
	 * este metodo me permite obtener la  fecha de inicio de una subasta 
	 * @return la fecha de inicio
	 */
	public Date getFechaInicio() {
		return fechaInicio;
	}
	/**
	 * este metodo me permite modificar la fecha de inicio de una subasta
	 * @param la nueva fecha de inicio
	 */
	public void setFechaInicio(Date fechaInicio) {
		this.fechaInicio = fechaInicio;
	}
	/**
	 * este metodo me permite obtener la fecha de terminacion de una subasta
	 * @return la fecha Cierre
	 */
	public Date getFechaCierre() {
		return fechaCierre;
	}
	/**
	 * este metodo me permite modificar la fecha de terminacion de una subasta
	 * @param la nueva fecha de cierre
	 */
	public void setFechaCierre(Date fechaCierre) {
		this.fechaCierre = fechaCierre;
	}
	/* (non-Javadoc)
	 * @see java.lang.Object#hashCode()
	 */
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + numSubasta;
		return result;
	}
	/* (non-Javadoc)
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Subasta other = (Subasta) obj;
		if (numSubasta != other.numSubasta)
			return false;
		return true;
	}
}
